华为机试复习--链表

NC78 反转链表

题目
输入一个链表,反转链表后,输出新链表的表头。

示例1
输入{1,2,3}
返回值{3,2,1}

class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode* cur=pHead;
        ListNode* pre=NULL;
        ListNode* nex=NULL;
        while(cur!=NULL)
        {
            nex=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nex;
        }
        return pre;
    }
};

NC33 合并有序链表

题目描述
将两个有序的链表合并为一个新链表,要求新的链表是通过拼接两个链表的节点来生成的,且合并后新链表依然有序。

示例1
输入
{1},{2}
返回值
{1,2}
示例2
输入
{2},{1}
返回值

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param l1 ListNode类 
     * @param l2 ListNode类 
     * @return ListNode类
     */
    ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
        // write code here
        ListNode* head=NULL;
        if(l1==NULL)
            return l2;
        if(l2==NULL)
            return l1;
        if(l1->val<=l2->val){
            head=l1;
            head->next=mergeTwoLists(l1->next, l2);
        }
        else{
            head=l2;
            head->next=mergeTwoLists(l1, l2->next);
        }
        return head;
    }
};

NC40 两个链表生成相加链表

题目描述
假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。
给定两个这种链表,请生成代表两个整数相加值的结果链表。
例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为 1->0->0->0。
示例1
输入
[9,3,7],[6,3]
返回值
{1,0,0,0}
备注:

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head1 ListNode类 
     * @param head2 ListNode类 
     * @return ListNode类
     */
    //反转链表并计算长度
    ListNode* ReverseList(ListNode* pHead,int &length) {
        ListNode* cur=pHead;
        ListNode* pre=NULL;
        ListNode* nex=NULL;
        while(cur!=NULL)
        {
            nex=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nex;
            length++;
        }
        return pre;
    }
    ListNode* addInList(ListNode* head1, ListNode* head2) {
        // write code here
        int len1=0;
        int len2=0;
        ListNode* re1=ReverseList(head1,len1);
        ListNode* re2=ReverseList(head2,len2);
        if(len1<len2){
            ListNode* tmp=re1;
            re1=re2;
            re2=tmp;
        }
        
        ListNode* a=re1;

        while(re1!=NULL){
            if(re2==NULL)
                break;
            int tmp=re1->val+re2->val;
            if(tmp<10)//不存在进位
                re1->val=tmp;
            else{//存在进位
                if(re1->next==NULL){//进位位原本不存在
                    re1->next=new ListNode(1);
                    re1->next->next=NULL;
                }
                else{//进位位存在
                    if(re1->next->val<9){//进位位小于9则只需要进位1次
                    re1->next->val+=1;
                }
                    else{//进位位为9则需要连续进位
                        re1->next->val=0;
                        if(re1->next->next==NULL)
                            re1->next->next=new ListNode(1);
                        else
                            re1->next->next->val+=1;
                    }     
                }
                re1->val=(tmp-10);
            }
            re1=re1->next;
            re2=re2->next;
        }
        return ReverseList(a,len1);
    }
};

NC66 两个链表的第一个公共节点

题目描述
输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)

/*
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};*/
class Solution {
public:
    ListNode* FindFirstCommonNode( ListNode* pHead1, ListNode* pHead2) {
        ListNode* p1=pHead1;
        ListNode* p2=pHead2;
        while(p1!=p2){
            p1=(p1==NULL?pHead2:p1->next);
            p2=(p2==NULL?pHead1:p2->next);
        }
        return p1;
    }
};

NC96 判断一个链表是否为回文结构

题目描述
给定一个链表,请判断该链表是否为回文结构。
示例1
输入
[1,2,2,1]
返回值
true

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 the head
     * @return bool布尔型
     */
    ListNode* ReverseList(ListNode* pHead) {
        ListNode* cur=pHead;
        ListNode* pre=NULL;
        ListNode* nex=NULL;
        while(cur!=NULL)
        {
            nex=cur->next;
            cur->next=pre;
            pre=cur;
            cur=nex;
        }
        return pre;
    }
    bool isPail(ListNode* head) {
        ListNode* fast = head, *slow = head;
        //通过快慢指针找到中点
        while (fast != NULL && fast->next != NULL) {
            fast = fast->next->next;
            slow = slow->next;
        }
        //如果fast不为空,说明链表的长度是奇数个
        if (fast != NULL) {
            slow = slow->next;
        }
        //反转后半部分链表
        slow = ReverseList(slow);

        fast = head;
        while (slow != NULL) {
            //然后比较,判断节点值是否相等
            if (fast->val != slow->val)
                return false;
            fast = fast->next;
            slow = slow->next;
        }
        return true;
    }
};

NC链表的奇偶重排

题目描述
给定一个单链表,请设定一个函数,将链表的奇数位节点和偶数位节点分别放在一起,重排后输出。
注意是节点的编号而非节点的数值。
示例1
输入
复制
{1,2,3,4,5,6}
返回值
复制
{1,3,5,2,4,6}
说明
1->2->3->4->5->6->NULL
重排后为
1->3->5->2->4->6->NULL
示例2
输入
复制
{1,4,6,3,7}
返回值
复制
{1,6,7,4,3}
说明
1->4->6->3->7->NULL
重排后为
1->6->7->4->3->NULL
奇数节点有1,6,7,偶数节点有4,3。重排后为1,6,7,4,3
备注:
链表长度不大于200000。每个数范围均在int内。

/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    ListNode* oddEvenList(ListNode* head) {
        // write code here
        if(head == NULL || head->next == NULL) 
            return head;
        ListNode* evenHead = head->next;
        ListNode* odd = head,*even = head->next;
        while(even != NULL && even->next != NULL){
            odd->next = even->next;
            odd = odd->next;
            even->next = odd->next;
            even = even->next;
        }
        odd->next = evenHead;
        return head;
    }
};
posted @ 2021-03-24 15:56  Jorgensen  阅读(65)  评论(0编辑  收藏  举报
#site_nav_under { display: none; } .c_ad_block, .ad_text_commentbox { display: none; margin: 0; padding: 0; } #ad_under_google { height: 0; overflow: hidden; } #ad_under_google a { display: none; }