zoukankan      html  css  js  c++  java
  • 剑指16.合并两个排序的链表

    题目描述

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

    思路

    可以使用递归实现,也可以用非递归。

    注意:需要考虑到很多很多特殊情况!!如边界条件;链表中的值有相同的情况;某一个链表中连续几个值都比另一个链表的当前值小(大)。

    解法1(递归)思路:当得到两个链表中值较小的头节点并把它链接到已经合并的链表之后,两个链表剩余的节点依然是排序的,因此可以用递归完成这一过程。

    解法2(非递归)思路:类似于归并排序中子序列的合并过程,不断比较两个链表的val值,然后判断哪个节点需要优先添加到合并链表尾部。

     

    解法1(递归):

    /*
    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)
                return list2;
            if(list2 == null)
                return list1;
            ListNode list = null;
            if(list1.val <= list2.val){
                list = list1;
                list.next = Merge(list1.next, list2);
            }else{
                list = list2;
                list.next = Merge(list1, list2.next);
            }
            return list;
        }
    }

     解法2(非递归):

    /*
    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)
                return list2;
            if(list2 == null)
                return list1;
            ListNode head = new ListNode(-1);//初始化合并链表的头节点
            ListNode cur = head; //该节点始终指向合并链表的尾部
            while(list1 != null && list2 != null){
                if(list1.val <= list2.val){
                    cur.next = list1;
                    list1 = list1.next;
                }else{
                    cur.next = list2;
                    list2 = list2.next;
                }
                cur = cur.next; //更新当前节点,使其始终指向合并链表的尾部
            }
            if(list1 != null)
                cur.next = list1;
            if(list2 != null)
                cur.next = list2;
            return head.next;
        }
    }
     
  • 相关阅读:
    IOS Array 排序方法
    一个制作Xcode5插件的模板
    UITableViewCell滑动删除及移动
    strong weak
    越狱检测/越狱检测绕过
    XML在线转化为JSON
    KissXML类库的使用方法
    iOS perform action after period of inactivity (no user interaction)
    Objective-C在ARC下结合GCD的单例模式和宏模版
    Xcode5 如何添加一个Github/Repository 并且Checkout
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13466678.html
Copyright © 2011-2022 走看看