一、题目描述
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
输入:l1 = [], l2 = []
输出:[]
输入:l1 = [], l2 = [0]
输出:[0]
二、题解
思路:分别用两个指针遍历两个链表,再用一个指针专门改变链表的指向。
一开始先找出头更小的那个链表作为头节点,依次取出两个指针指向的链表元素,谁小,就改变当前节点的指向,让当前节点始终指向更小的元素。两个指针一直前进,当指向为空时,遍历结束。
/**
* 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) {
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
//头节点指针
ListNode head;
//操作链表1的指针
ListNode cur1 = list1;
//操作链表2的指针
ListNode cur2 = list2;
//比较两个链表的头节点谁小谁就作为新的头
if (list1.val < list2.val) {
head = list1;
cur1 = list1.next;
} else {
head = list2;
cur2 = list2.next;
}
ListNode pre = head;
while (true) {
//遍历完了list1,让pre直接指向list2
if (cur1 == null) {
pre.next = cur2;
break;
}
//遍历完了list2,让pre直接指向list1
if (cur2 == null) {
pre.next = cur1;
break;
}
int val1 = cur1.val;
int val2 = cur2.val;
if (val1 <= val2) {
pre.next = cur1;
pre = pre.next;
cur1 = cur1.next;
} else {
pre.next = cur2;
pre = pre.next;
cur2 = cur2.next;
}
}
return head;
}
}