首页 > 其他 > 详细

合并两个有序链表

时间:2019-10-11 21:35:08      阅读:81      评论:0      收藏:0      [点我收藏+]

今天刷第2道LeetCode题,合并两个有序链表:

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

解题思路:

  1. 先判断边界条件,如果有任意一个链表为空,则直接返回其中不为空的链表

  2. 然后在一个循环里面,同时从左往右遍历两个链表

  3. 遍历过程中,依次比较两个链表的值,把较小值放入新链表中,然后将对应链表的指针往右移动一位

  4. 重复步骤3,直到:遍历次数超出两个链表长度之和,或者任何一个链表已经遍历到了末尾,则跳出循环

  5. 把未遍历完的链表的后续数值全部放入新链表中,结束

 

java实现如下:

public class MergeTwoLists {

    public static void main(String[] args) {

        ListNode listNode1 = new ListNode(1);
        listNode1.next = new ListNode(2);
        listNode1.next.next = new ListNode(4);

        ListNode listNode2 = new ListNode(1);
        listNode2.next = new ListNode(3);
        listNode2.next.next = new ListNode(4);

        ListNode listNode = mergeTwoLists(listNode1, listNode2);
        ListNode.print(listNode);

    }


    public static ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }

        ListNode result = new ListNode();
        ListNode resultHead = result;
        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                result.next = new ListNode(l1.val);
                l1 = l1.next;
            } else {
                result.next = new ListNode(l2.val);
                l2 = l2.next;
            }
        }
        if (l1 != null) {
            result.next = l1;
        }
        if (l2 != null) {
            result.next = l2;
        }

        return resultHead.next;

    }

}


class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }

    ListNode() {
    }

    public static void print(ListNode listnode) {
        while (listnode != null) {
            System.out.println(listnode.val);
            listnode = listnode.next;
        }
    }

}

一开始是这样去实现的,但是发现,输出结果是4,也就是最后的结果,这个链表只有一个节点。其实问题在于最后的输出,是该链表的最后一个节点,链表头的指针丢失了,java没有像c语言那样的指针。

于是我把代码改成以下这样,在函数中加入额外的参数,期待以此来保存结果链表的头指针。然后事与愿违,输出结果还是不变。问题明天再找,先休息。

public class MergeTwoLists {

    public static void main(String[] args) {

        ListNode listNode1 = new ListNode(1);
        listNode1.next = new ListNode(2);
        listNode1.next.next = new ListNode(4);

        ListNode listNode2 = new ListNode(1);
        listNode2.next = new ListNode(3);
        listNode2.next.next = new ListNode(4);

        ListNode result = new ListNode();
        mergeTwoLists(listNode1, listNode2, result);
        ListNode.print(result.next);

    }


    public static void mergeTwoLists(ListNode l1, ListNode l2, ListNode result) {
        if (l1 == null) {
            result.next = l2;
        }
        if (l2 == null) {
            result.next = l1;
        }

        while (l1 != null && l2 != null) {
            if (l1.val <= l2.val) {
                result.next = new ListNode(l1.val);
                l1 = l1.next;
            } else {
                result.next = new ListNode(l2.val);
                l2 = l2.next;
            }
        }
        if (l1 != null) {
            result.next = l1;
        }
        if (l2 != null) {
            result.next = l2;
        }


    }

}


class ListNode {
    int val;
    ListNode next;

    ListNode(int x) {
        val = x;
    }

    ListNode() {
    }

    public static void print(ListNode listnode) {
        while (listnode != null) {
            System.out.println(listnode.val);
            listnode = listnode.next;
        }
    }

}

 

合并两个有序链表

原文:https://www.cnblogs.com/zhangxuezhi/p/11656732.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!