题解 | #合并两个排序的链表#

合并两个排序的链表

https://www.nowcoder.com/practice/d8b6b4358f774294a89de2a6ac4d9337

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
  public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
        if (pHead1 == nullptr)return pHead2;
        if (pHead2 == nullptr)return pHead1;
        ListNode* dPtr = (pHead1->val) < (pHead2->val) ? pHead1 :
                         pHead2; //移动指针,初始化为最小端链头
        ListNode* sPtr = (dPtr == pHead2) ? pHead1 : pHead2; //固定指针
        ListNode* tmp = nullptr;
		//取首元素较小的链表为基本链表(其必定为输出结果),移动指针指向首位,另一链表首位安置固定指针;
		//移动指针逐个与固定指针的指向值比较遍历,保证遍历过的元素满足递增排序,位置固定;
		//当移动指针遇到更大值时,移动指针后续链表与固定指针交换;
		//重复移动指针的比较遍历,直到移动指针行至当前链末,最后合并固定指针指向的链表.
        while (true) {
            while (dPtr->next != nullptr && ((dPtr->next->val) <= (sPtr->val)))
                dPtr = dPtr->next;
            //dPtr->next == nullptr || dPtr->next->val > sPtr->val
            if (dPtr->next == nullptr) {
                dPtr->next = sPtr;
                break;
            }
            tmp = dPtr->next;
            dPtr->next = sPtr;
            sPtr = tmp;
        }
        return ((pHead1->val) < (pHead2->val)) ? pHead1 : pHead2;
    }
};

全部评论

相关推荐

腾讯 后台开发 22k+3w
点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务