程序员

剑指offer----合并两个排序的链表

2018-02-04  本文已影响0人  qming_c

题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/

代码一:

public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null || list2 == null)
        {
            return list1 != null ? list1 : list2;
        }
        if(list1.val < list2.val){
            list1.next =  Merge(list1.next, list2);
            return list1;
        }else{
            list2.next =  Merge(list1, list2.next);
            return list2;
        }
    }
}

这是使用递归的方法,没层递归返回list1 与 list2中最小的节点, 并将next指针指向下一层递归,并将为排序的节点传入参数中。
代码二

public class Solution {
    public ListNode Merge(ListNode list1,ListNode list2) {
        if(list1 == null || list2 == null){
            return list1 == null ? list2 : list1;
        }
        ListNode head = null;
        ListNode current = null;
        if(list1.val <= list2.val){
            head = list1;
            current = list1;
            list1 = list1.next;
        }else{
            head = list2;
            current = list2;
            list2 = list2.next;
        }
        while(list1 != null && list2 != null){
            if(list1.val <= list2.val){
                current.next = list1;
                current = current.next;
                list1 = list1.next;
            }else{
                current.next = list2;
                current = current.next;
                list2 = list2.next;
            }
        }
        current.next = (list1 == null ? list2 : list1);
        return head;
    }
}

这是遍历版本,首先初始化current和head(head头结点,current用来构造排序之后的链表)通过比较不断的将节点加入到current。
因为当list1, list2一方为null时循环就结束了,最后需要将非空一方的节点全部接到current的后面。

上一篇下一篇

猜你喜欢

热点阅读