剑指offer之合并两个排序的链表(C++/Java双重实现)

1.问题描述

输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。
示例1:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4
限制:
0 <= 链表长度 <= 1000

在这里插入图片描述

2.问题分析

我们打个比方
在这里插入图片描述
我们先定义两个头指针分别指向A,B链表的第一个结点(p1,p2),然后再定义第三个头指针指向我们连接后的第一个结点(p3),然后进行A,B链表的第一个结点的比较,小的用我们的第三个头指针连接起来,上图是A小,那么头指针(p3)连接的第一个结点是1,然后A的头指针的指向向后移动一位,指向第二个结点3,然后再与B比较,谁比较小再用p3连接起来,最终把两个链表合成一个链表

3.代码实现

3.1C++代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        ListNode *p1=l1;
        ListNode *p2=l2;
        ListNode *p3;
        ListNode *head=p3;
        while(p1&&p2)
        {
            if(p1->val<=p2->val)
            {
                p3->next=p1;
                p1=p1->next;
                p3=p3->next;
            }
            else{
                p3->next=p2;
                p2=p2->next;
                p3=p3->next;      
            }
        }
        p3->next=p1?p1:p2;
        return head->next;
    }
};
3.1Java代码
/**
 * 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 p1=l1;
        ListNode p2=l2;
        ListNode p3=new ListNode(0);
        ListNode head=p3;
        while(p1!=null&&p2!=null)
        {
            if(p1.val<=p2.val)
            {
                p3.next=p1;
                p1=p1.next;
                p3=p3.next;
            }
            else{
                p3.next=p2;
                p2=p2.next;
                p3=p3.next;      
            }
        }
        p3.next=(p1!=null)?p1:p2;
        return head.next;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_45737068/article/details/107103122