题目来源
https://leetcode-cn.com/problems/merge-two-sorted-lists/description/
题目描述
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
解题思路
- 首先得有一个新的虚拟节点
newHead
用来将这两个链表串起来 - 如图这样两个有序单链表,
l1.val >= l2.val
,遵守稳定性,将l1
串到newHead
所在的新链表后面,然后l1
后移一位 - 如果
l2
的值大于l1
的值,就将l2
串到newHead
所在的新链表,然后l2
后移一位 - 如果
l1
为空,就直接把l2
串到newHead
所在的新链表后面 - 如果
l2
为空,就直接把l1
串到newHead
所在的新链表后面 - 最后返回
newHead.next
节点,即新的头节点
图解
实现代码
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
/**
* newHead
* @param l1 List1's head
* @param l2 List2's head
* @return newList's newHead
*/
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
//define a virtual head mark head
ListNode newHead = new ListNode(-1);
ListNode cur = newHead;
while (l1 != null && l2 !=null) {
if (l1.val <= l2.val) {
cur.next = l1;
l1 = l1.next;
cur = cur.next;
} else {
cur.next = l2;
l2 =l2.next;
cur =cur.next;
}
}
if (l1 == null) {
cur.next = l2;
}
if (l2 == null) {
cur.next = l1;
}
return newHead.next;
}