zoukankan      html  css  js  c++  java
  • 14--合并两个排序的链表

    //
    //  main.cpp
    //  combineSortedList
    //
    //  Created by Hugo Cao  on 15/7/8.
    //  Copyright (c) 2015年 Hugo Cao . All rights reserved.
    //
    
    /*
     题目:合并两个排序的链表
     输入两个递增排序的链表,
     合并这两个链表并使链表中的结点仍然是按照递增顺序排列的,
     
     例如 1 3 5 7
     2 4 6 8.
    
     测试数据:需要添加 null链表 和 相等的链表
      
     */
    
    
    #include <iostream>
    using namespace std;
    
    typedef struct ListNode {
        int m_value;
        ListNode *m_pnext;
    } ListNod, *LNode;
    
    //添加结点
    LNode addlistNode(int value)
    {
        LNode pNode = new ListNod();
        if (pNode == NULL)
        {
            cout << "申请失败" << endl;
            return NULL;
        }
        pNode->m_value = value;
        pNode->m_pnext = NULL;
        
        return pNode;
    }
    
    //链接节点
    void connectList(LNode point1, LNode point2)
    {
        if (point1 != NULL && point2 != NULL)
            point1->m_pnext = point2;
    }
    
    
    //创建链表
    LNode createListOne()
    {
        LNode p1 = addlistNode(1);
        LNode p2 = addlistNode(3);
        LNode p3 = addlistNode(5);
        LNode p4 = addlistNode(7);
        
        connectList(p1, p2);
        connectList(p2, p3);
        connectList(p3, p4);
        
        return p1;
    }
    
    LNode createListTwo()
    {
        LNode p1 = NULL;
    //    LNode p1 = addlistNode(1);
    //    LNode p2 = addlistNode(3);
    //    LNode p3 = addlistNode(5);
    //    LNode p4 = addlistNode(7);
    //    
    //    connectList(p1, p2);
    //    connectList(p2, p3);
    //    connectList(p3, p4);
        
        return p1;
    }
    
    //输出列表
    void printList(LNode head)
    {
        cout << "========" << endl;
        if (head == NULL)
        {
            cout << "is empty" << endl;
            return ;
        }
        
        LNode p1 = head;
        while (p1 != NULL) {
            cout << p1->m_value << " ";
            p1 = p1->m_pnext;
        }
        
        cout << endl;
    }
    
    
    
    //合并两个排序列表
    LNode combineSortList(LNode p1, LNode p2)
    {
        if (p1 == NULL && p2 == NULL)       // 两个链表都为空
        {
            cout << "链表都为空,无需排序" << endl;
            return NULL;
        }
        if (p1 == NULL && p2 != NULL)       // 其中一个为空
        {
            return p2;
        }
        if (p1 != NULL && p2 == NULL)
        {
            return p1;
        }
        
        LNode head = NULL, point = NULL;    //头结点和链接结点
        while (p1 != NULL && p2 != NULL)
        {
            //如果2个链表出现了相同的数字,就去掉一个
            if (p1->m_value == p2->m_value)
            {
                LNode fp = p1;
                p1 = p1->m_pnext;
                delete fp;
            }
            //p1,p2都不为空,如果p1 > p2.
            if ((p1 != NULL && p2 != NULL) && (p1->m_value > p2->m_value))
            {
                if (point == NULL)      //当point为空时,就是头结点
                {
                    point = p2;
                    head = point;
                }
                else
                {
                    point->m_pnext = p2;
                    point = p2;
                }
                
                p2 = p2->m_pnext;
                
            }
            if ((p1 != NULL && p2 != NULL) && (p1->m_value < p2->m_value))
            {
                if (point == NULL)      //当point为空时,就是头结点
                {
                    point = p1;
                    head = point;
                }
                else
                {
                    point->m_pnext = p1;
                    point = p1;
                }
                
                p1 = p1->m_pnext;
            }
        }
        
        //判断是否有剩余结点,余下全部连接。
        if (p1 == NULL && p2 != NULL)
        {
            point->m_pnext = p2;
        }
        else if (p2 == NULL && p1 != NULL)
        {
            point->m_pnext = p1;
        }
        
        return head;
    }
    
    
    
    
    int main()
    {
        
        LNode p1 = createListOne();
        LNode p2 = createListTwo();
        
        printList(p1);
        printList(p2);
        
        cout << "合并" << endl;
        
        LNode head = combineSortList(p1, p2);
        printList(head);
        
        return 0;
    }
  • 相关阅读:
    Unix Domain Socket(基于 Linux-2.4.0已更新)
    Eclipse常用设置及部分常用快捷键个人总结(MyEclipse通用)
    使用Docker安装ElasticSearch 以及我遇到的问题
    使用Docker安装MySQL
    es 索引自动删除
    k8s部署zk集群
    k8s-基于Canal来定义网络策略
    Markdown学习
    python ---- Linux压缩某个目录但要跳过指定文件
    WEB前端 ---- 学习第二天(表格、表单、css等)
  • 原文地址:https://www.cnblogs.com/hgonlywj/p/4842561.html
Copyright © 2011-2022 走看看