remove-duplicates-from-sorted-list-ii

Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list.
For example,
Given1->2->3->3->4->4->5, return1->2->5.
Given1->1->1->2->3, return2->3.
本来是一道水题,结果彻底被教做人了。也反应了我的链表操作不太熟悉!
本题看起来虽然简单但是许多细节要注意!
首先是要记录头结点,其次是链表链接是要在不删除的情况下载连接,连接的时候,不要直接用p浅拷贝,因为p中的next值很容易造成错误,本来这条链是没有连起来的,结果连起来了。
注意结点的移动和结点的修改的区别。p->next = .., p = p->…。!

#include <iostream>
using namespace std;


 struct ListNode {
      int val;
      ListNode *next;
      ListNode(int x) : val(x), next(NULL) {}
  };


ListNode *deleteDuplicates(ListNode *head) {
         ListNode *  pp  = new ListNode(-1); pp->next = head;
         ListNode *  p   = head;
         ListNode * ans=NULL;
         int first = 1;
            while (p) {
                   ListNode * pt = p ;
                   int flag = 0;
                   while(pt->next&&pt->val==pt->next->val) {
                       pt->next=pt->next->next; 
                       flag = 1;
                   }
                   if(!flag) {          
                    pp->next = new ListNode(p->val);
                    pp=pp->next;
                    p=p->next;
                     if(first) {
                        ans = pp;
                        first = 0; 
                     }
                   } else {
                     p = p->next;
                   }

            }
            return ans;
} 

void printList(ListNode* head) {
        ListNode* tmp = head;
        while(tmp) {
            cout<<tmp->val<<" ";
            tmp = tmp->next; 
        }
        cout<<endl;
}

int main() {
    int t;
    cin>>t;
    while(t--) {
        cout<<"请输入要输入链表的长度\n";
        int n;
        cin>>n;
        int a; cin>>a; 
        ListNode* head = new ListNode(a); 
        ListNode* p = head; 
        for (int i=1;i<n;i++) {
              cin>>a; 
            ListNode* tmp = new ListNode(a);
            p->next = tmp;
            p=p->next;
        } 
        cout<<"处理前的链表为:\n";
        printList(head);
        cout<<"处理后的链表为:\n";
        head = (*deleteDuplicates)(head);
            printList(head);

    }

}
Sure, here is an example program in Python that implements the commands you provided: ```python # dictionary to store sequences of numbers for each ID sequences = {} # function to create a new sequence for an ID def new(id): if id not in sequences and id < 200000: sequences[id] = [] return True else: return False # function to add a number to a sequence for an ID def add(id, num): if id in sequences: sequences[id].append(num) return True else: return False # function to merge two sequences for two IDs def merge(id1, id2): if id1 in sequences and id2 in sequences: sequences[id1] += sequences[id2] sequences[id2] = [] return True else: return False # function to remove duplicates from a sequence for an ID def unique(id): if id in sequences: sequences[id] = list(set(sequences[id])) return True else: return False # function to output the sequence for an ID def out(id): if id in sequences: output = ' '.join(map(str, sorted(sequences[id]))) print(output) return True else: return False # example usage of the functions new(1) add(1, 5) add(1, 3) add(1, 2) add(1, 5) unique(1) out(1) merge(1, 2) add(2, 1) add(2, 4) out(1) out(2) ``` This program creates a dictionary to store sequences of numbers for each ID, and defines functions to implement the commands you provided. The `new`, `add`, `merge`, `unique`, and `out` functions correspond to the `new id`, `Add id num`, `merge id1 id2`, `unique id`, and `out id` commands, respectively. Using the example usage of the functions at the bottom of the program, the program creates a new sequence for ID 1, adds some numbers to it, removes duplicates, outputs the sequence, merges it with the sequence for ID 2, adds some numbers to the sequence for ID 2, and outputs both sequences. The program should output: ``` 2 3 5 1 2 3 4 5 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值