题目描述
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
两个链表从表头开始,比较两个元素的大小,把其中较小的元素存入新的链表,则较小元素对应的原链表的表头更新为下一个元素。如果其中一个链表为空,则把另一个链表整个链接到新链表的表尾。
我的程序
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution { // 注意,表头是第一个元素对应的节点,而不是指向第一个元素的节点
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode head = null; // 保存最后的表头
ListNode local = null; // 保存当前指针
int count = 0;
int minVal = 0;
while(l1 != null || l2 != null) // 两个链表还有元素没有存入新链表
{
if(l1 != null && l2 != null) // 两个链表都还有元素,则比较他们的大小,把小的存入新链表
{
if(l1.val < l2.val)
{
minVal = l1.val;
l1 = l1.next;
}else
{
minVal = l2.val;
l2 = l2.next;
}
ListNode node = new ListNode(minVal);
node.next = null;
if(count == 0) // 第一个元素
{
count++;
head = node;
local = node;
}else
{
local.next = node;
local = node;
}
}else if(l1 != null) // 只有l1链表还有元素,把l1剩下的链表元素存入新链表
{
if(count == 0) return l1;
local.next = l1;
l1 = null;
}else // 只有l2链表还有元素,把l2剩下的链表元素存入新链表
{
if(count == 0) return l2;
local.next = l2;
l2 = null;
}
}
return head;
}
}
简化版程序
我上面写得太复杂了,找了一个简化版(来自LeetCode的Angus-Liu用户):
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
// 类似归并排序中的合并过程
ListNode dummyHead = new ListNode(0);
ListNode cur = dummyHead;
while (l1 != null && l2 != null) {
if (l1.val < l2.val) {
cur.next = l1;
cur = cur.next;
l1 = l1.next;
} else {
cur.next = l2;
cur = cur.next;
l2 = l2.next;
}
}
// 任一为空,直接连接另一条链表
if (l1 == null) {
cur.next = l2;
} else {
cur.next = l1;
}
return dummyHead.next;
}
}
其他方法,可参考官方解题。
如有不当之处,欢迎读者批评指正!