力扣题目:合并两个有序链表
开篇
今天是备战蓝桥杯的第24天及算法村开营第2天。根据算法村的讲义,来刷链表的相关题目。今天要分享的是合并两个有序链表。
题目链接: 21.合并两个有序链表
题目描述
代码思路
通过创建一个新链表,然后遍历两个链表,每次取两个链表指向的值中小的那个,放入新链表中,直到两个遍历完成。
当然,要优化一下,当有一个链表遍历完成时,我们可以直接让新链表的表尾指向另外一个链表未遍历的部分。
代码纯享版
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode head = new ListNode(-1);
ListNode node = head;
while(list1 != null && list2 != null){
if(list1.val > list2.val) {
node.next = list2;
list2 = list2.next;
}
else{
node.next = list1;
list1 = list1.next;
}
node = node.next;
}
if(list1 == null) node.next = list2;
else node.next = list1;
return head.next;
}
}
代码逐行解析版
class Solution {
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
ListNode head = new ListNode(-1); //创建一个头结点,赋值为-1,值是随便赋的。头结点主要是为了方便最后返回链表
ListNode node = head; //创建结点node指向head,之后的操作都由node指向,head就一直处在链表的头
while(list1 != null && list2 != null){ //循环条件是两个链表都不为空时
if(list1.val > list2.val) {//如果表1的值大于表2
node.next = list2; //把表2的值赋给node.next,注意不是node,赋给node的话,head就没意义了
list2 = list2.next; //list2指向下一个结点
}
else{ //与上面同理,把list2换成list1
node.next = list1;
list1 = list1.next;
}
node = node.next; //node指向下一个结点
}
if(list1 == null) node.next = list2;//循环结束证明还有至多一个表不为空,让node.next指向不为空的表
else node.next = list1;
return head.next; //返回head.next,注意:head是-1,不是我们要返回的
}
}
结语
如果这道力扣题的分享对您有所帮助,点个关注,我会每天更新力扣题目的讲解,与大伙儿一同向前迈进!